import streamlit as st
from typing import Dict, List

def render_help_page():
    """渲染帮助页面"""
    
    st.header("❓ 帮助中心")
    st.markdown("数据预处理工具使用指南和常见问题解答")
    
    # 创建标签页
    tab1, tab2, tab3, tab4, tab5 = st.tabs(["🚀 快速开始", "📖 使用指南", "❓ 常见问题", "🔧 技术说明", "📞 联系支持"])
    
    with tab1:
        render_quick_start()
    
    with tab2:
        render_user_guide()
    
    with tab3:
        render_faq()
    
    with tab4:
        render_technical_info()
    
    with tab5:
        render_contact_support()

def render_quick_start():
    """渲染快速开始"""
    
    st.subheader("🚀 快速开始")
    st.markdown("5分钟快速上手数据预处理工具")
    
    # 步骤指南
    st.markdown("### 📋 操作步骤")
    
    steps = [
        {
            "title": "1️⃣ 上传文档",
            "description": "在主页面上传您的PDF、Word或Markdown文档",
            "tips": ["支持单个或多个文件上传", "文件大小限制：100MB", "支持拖拽上传"]
        },
        {
            "title": "2️⃣ 配置参数",
            "description": "在配置页面设置数据清洗和切片参数",
            "tips": ["可使用预设配置", "支持自定义参数", "实时预览效果"]
        },
        {
            "title": "3️⃣ 开始处理",
            "description": "点击开始处理按钮，等待处理完成",
            "tips": ["处理时间取决于文档大小", "可查看实时进度", "支持批量处理"]
        },
        {
            "title": "4️⃣ 预览结果",
            "description": "在预览页面查看处理结果和质量分析",
            "tips": ["查看切片效果", "分析质量指标", "优化建议"]
        },
        {
            "title": "5️⃣ 导出数据",
            "description": "在下载页面选择格式并导出处理结果",
            "tips": ["支持多种格式", "适配向量数据库", "批量导出"]
        }
    ]
    
    for step in steps:
        with st.expander(step["title"], expanded=False):
            st.markdown(step["description"])
            st.markdown("**💡 小贴士:**")
            for tip in step["tips"]:
                st.markdown(f"• {tip}")
    
    # 视频教程
    st.markdown("### 🎥 视频教程")
    st.info("📺 完整的视频教程即将推出，敬请期待！")
    
    # 示例文档
    st.markdown("### 📄 示例文档")
    
    col1, col2, col3 = st.columns(3)
    
    with col1:
        if st.button("📄 下载PDF示例", use_container_width=True):
            st.info("PDF示例文档下载功能开发中...")
    
    with col2:
        if st.button("📝 下载Word示例", use_container_width=True):
            st.info("Word示例文档下载功能开发中...")
    
    with col3:
        if st.button("📋 下载Markdown示例", use_container_width=True):
            st.info("Markdown示例文档下载功能开发中...")

def render_user_guide():
    """渲染使用指南"""
    
    st.subheader("📖 详细使用指南")
    
    # 功能模块指南
    guide_sections = [
        {
            "title": "📁 文件上传",
            "content": """
            **支持的文件格式:**
            - PDF文档 (.pdf)
            - Word文档 (.docx)
            - Markdown文档 (.md)
            
            **上传方式:**
            - 点击上传按钮选择文件
            - 直接拖拽文件到上传区域
            - 支持批量选择多个文件
            
            **文件要求:**
            - 单个文件大小不超过100MB
            - 文件内容应为文本格式（非扫描版PDF）
            - 文件名建议使用英文或数字
            """
        },
        {
            "title": "🧹 数据清洗",
            "content": """
            **清洗功能:**
            - Unicode规范化：统一字符编码格式
            - 移除特殊字符：清理无意义的符号
            - 修复断行：合并被错误分割的句子
            - 移除页眉页脚：去除重复的页面信息
            - 去除重复内容：删除重复的段落或句子
            - 移除空行：清理多余的空白行
            
            **参数设置:**
            - 最小行长度：过滤过短的文本行
            - 保留格式标记：是否保留Markdown等格式
            - 自定义规则：添加特定的清洗规则
            """
        },
        {
            "title": "✂️ 文档切片",
            "content": """
            **切片策略:**
            
            1. **固定长度切片**
               - 按指定字符数切分文档
               - 可设置重叠长度避免信息丢失
               - 适用于通用文档处理
            
            2. **按内容类型切片**
               - 根据段落、标题、列表等结构切分
               - 保持内容的逻辑完整性
               - 适用于结构化文档
            
            3. **按文档结构切片**
               - 基于文档的章节结构切分
               - 保持层级关系
               - 适用于学术论文、技术文档
            
            4. **层级结构切片**
               - 创建父子关系的切片
               - 支持多级嵌套
               - 适用于复杂文档结构
            
            5. **自定义分隔符切片**
               - 使用自定义标记切分
               - 灵活的切分规则
               - 适用于特殊格式文档
            """
        },
        {
            "title": "📊 结果预览",
            "content": """
            **预览功能:**
            - 统计概览：文档数量、切片数量、字符统计
            - 内容预览：原始内容、清洗后内容对比
            - 结构信息：文档结构、标题层级
            - 切片预览：切片内容、元数据信息
            
            **质量分析:**
            - 整体指标：平均切片长度、重复率等
            - 详细分析：每个切片的质量评估
            - 问题诊断：识别潜在的质量问题
            - 优化建议：提供改进建议
            """
        },
        {
            "title": "📥 结果导出",
            "content": """
            **导出格式:**
            - Dify JSON：适用于Dify平台
            - Ragflow JSON：适用于Ragflow平台
            - CSV表格：便于数据分析
            - 纯文本：通用文本格式
            - Markdown：保留格式的文档
            - Excel工作簿：多工作表数据
            
            **导出选项:**
            - 快速导出：使用预设格式
            - 自定义导出：自定义字段和格式
            - 批量下载：多格式打包下载
            - 格式转换：在不同格式间转换
            """
        }
    ]
    
    for section in guide_sections:
        with st.expander(section["title"], expanded=False):
            st.markdown(section["content"])

def render_faq():
    """渲染常见问题"""
    
    st.subheader("❓ 常见问题解答")
    
    # FAQ数据
    faqs = [
        {
            "category": "🔧 技术问题",
            "questions": [
                {
                    "q": "为什么我的PDF文档无法正确解析？",
                    "a": """
                    可能的原因和解决方案：
                    
                    1. **扫描版PDF**: 工具目前只支持文本型PDF，不支持扫描版PDF
                       - 解决方案：使用OCR工具先转换为文本型PDF
                    
                    2. **PDF损坏**: 文件可能已损坏
                       - 解决方案：尝试用其他PDF阅读器打开，或重新生成PDF
                    
                    3. **编码问题**: PDF使用了特殊编码
                       - 解决方案：尝试将PDF另存为新文件
                    
                    4. **权限限制**: PDF设置了访问权限
                       - 解决方案：移除PDF的访问限制
                    """
                },
                {
                    "q": "Word文档的表格和图片会被处理吗？",
                    "a": """
                    表格和图片的处理情况：
                    
                    **表格处理:**
                    - ✅ 表格内容会被提取为文本
                    - ✅ 保留表格的基本结构信息
                    - ✅ 可以选择是否保留表格格式
                    
                    **图片处理:**
                    - ❌ 图片内容不会被提取（不支持OCR）
                    - ✅ 图片的标题和说明文字会被保留
                    - ✅ 图片位置信息会在元数据中记录
                    
                    **建议:**
                    - 如需处理图片中的文字，请先使用OCR工具提取
                    - 重要的表格数据建议单独处理
                    """
                },
                {
                    "q": "处理大文件时为什么会很慢？",
                    "a": """
                    处理速度影响因素：
                    
                    **文件大小:**
                    - 大文件需要更多处理时间
                    - 建议单个文件不超过50MB
                    
                    **文档复杂度:**
                    - 复杂格式的文档处理更慢
                    - 大量表格、图片会增加处理时间
                    
                    **切片策略:**
                    - 复杂的切片策略需要更多计算
                    - 层级结构切片比固定长度切片慢
                    
                    **优化建议:**
                    - 分批处理大文件
                    - 选择合适的切片策略
                    - 关闭不必要的清洗选项
                    """
                }
            ]
        },
        {
            "category": "⚙️ 配置问题",
            "questions": [
                {
                    "q": "如何选择合适的切片长度？",
                    "a": """
                    切片长度选择指南：
                    
                    **根据用途选择:**
                    - **问答系统**: 200-500字符，保证问题的完整性
                    - **文档检索**: 500-1000字符，平衡检索精度和召回率
                    - **摘要生成**: 1000-2000字符，提供足够的上下文
                    
                    **根据文档类型:**
                    - **学术论文**: 800-1200字符，保持段落完整性
                    - **技术文档**: 400-800字符，便于精确定位
                    - **新闻文章**: 300-600字符，保持信息的独立性
                    
                    **重叠设置:**
                    - 一般设置为切片长度的10-20%
                    - 避免重要信息在切片边界丢失
                    """
                },
                {
                    "q": "预设配置有什么区别？",
                    "a": """
                    预设配置对比：
                    
                    **学术论文配置:**
                    - 切片长度：1000字符
                    - 重叠长度：200字符
                    - 保留引用格式
                    - 按章节结构切片
                    - 适用于：研究论文、学位论文
                    
                    **技术文档配置:**
                    - 切片长度：600字符
                    - 重叠长度：100字符
                    - 保留代码格式
                    - 按内容类型切片
                    - 适用于：API文档、技术手册
                    
                    **通用文档配置:**
                    - 切片长度：500字符
                    - 重叠长度：50字符
                    - 基础清洗
                    - 固定长度切片
                    - 适用于：一般文档、新闻文章
                    """
                },
                {
                    "q": "如何自定义清洗规则？",
                    "a": """
                    自定义清洗规则设置：
                    
                    **正则表达式规则:**
                    - 支持Python正则表达式语法
                    - 可以定义要移除的模式
                    - 可以定义替换规则
                    
                    **常用规则示例:**
                    ```
                    # 移除页码
                    r'第\s*\d+\s*页'
                    
                    # 移除邮箱
                    r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
                    
                    # 移除URL
                    r'https?://[^\s]+'
                    
                    # 移除多余空格
                    r'\s{2,}' -> ' '
                    ```
                    
                    **注意事项:**
                    - 测试规则避免误删重要内容
                    - 复杂规则可能影响处理速度
                    """
                }
            ]
        },
        {
            "category": "📊 导出问题",
            "questions": [
                {
                    "q": "Dify和Ragflow格式有什么区别？",
                    "a": """
                    两种格式的主要区别：
                    
                    **Dify格式特点:**
                    ```json
                    {
                        "content": "切片内容",
                        "metadata": {
                            "source": "来源文件",
                            "chunk_id": "切片ID",
                            "page": 1
                        },
                        "source": "文件名"
                    }
                    ```
                    
                    **Ragflow格式特点:**
                    ```json
                    {
                        "text": "切片内容",
                        "meta": {
                            "doc_name": "文档名称",
                            "page_num": 1
                        },
                        "doc_id": "文档ID"
                    }
                    ```
                    
                    **选择建议:**
                    - 使用Dify平台选择Dify格式
                    - 使用Ragflow平台选择Ragflow格式
                    - 通用用途可选择JSON格式
                    """
                },
                {
                    "q": "如何批量导出多种格式？",
                    "a": """
                    批量导出操作步骤：
                    
                    1. **选择格式**: 在下载页面的"批量下载"标签中选择需要的格式
                    
                    2. **设置组织方式**:
                       - 按格式分组：每种格式一个文件夹
                       - 按源文件分组：每个源文件一个文件夹
                       - 扁平结构：所有文件在同一层级
                    
                    3. **选择压缩方式**:
                       - ZIP压缩：生成压缩包下载
                       - 无压缩：提供单独下载链接
                    
                    4. **开始导出**: 点击"开始批量导出"按钮
                    
                    **优势:**
                    - 一次性获得多种格式
                    - 便于不同平台使用
                    - 节省重复操作时间
                    """
                },
                {
                    "q": "导出的文件可以直接导入向量数据库吗？",
                    "a": """
                    向量数据库兼容性：
                    
                    **直接兼容:**
                    - ✅ Dify格式 → Dify平台
                    - ✅ Ragflow格式 → Ragflow平台
                    - ✅ CSV格式 → 大多数数据库
                    
                    **需要转换:**
                    - 🔄 其他格式可能需要格式转换
                    - 🔄 字段映射可能需要调整
                    
                    **导入建议:**
                    1. 先小批量测试导入
                    2. 检查字段映射是否正确
                    3. 验证数据完整性
                    4. 确认向量化效果
                    
                    **常见问题:**
                    - 字段名不匹配：使用格式转换功能
                    - 编码问题：确保使用UTF-8编码
                    - 数据格式：检查JSON格式是否正确
                    """
                }
            ]
        }
    ]
    
    # 渲染FAQ
    for category_data in faqs:
        st.markdown(f"### {category_data['category']}")
        
        for faq in category_data['questions']:
            with st.expander(faq['q'], expanded=False):
                st.markdown(faq['a'])

def render_technical_info():
    """渲染技术说明"""
    
    st.subheader("🔧 技术说明")
    
    # 技术架构
    with st.expander("🏗️ 技术架构", expanded=False):
        st.markdown("""
        **核心技术栈:**
        - **前端框架**: Streamlit
        - **文档解析**: PyMuPDF (PDF), python-docx (Word), markdown (Markdown)
        - **文本处理**: spaCy, regex, chardet
        - **数据处理**: pandas, numpy
        - **可视化**: plotly
        
        **架构设计:**
        ```
        用户界面 (Streamlit)
            ↓
        文档处理器 (DocumentProcessor)
            ↓
        ┌─────────────┬─────────────┬─────────────┐
        │ PDF处理器   │ Word处理器  │ MD处理器    │
        └─────────────┴─────────────┴─────────────┘
            ↓
        文本清洗器 (TextCleaner)
            ↓
        切片引擎 (ChunkingEngine)
            ↓
        结果导出器 (Exporters)
        ```
        """)
    
    # 支持的文件格式
    with st.expander("📄 支持的文件格式", expanded=False):
        st.markdown("""
        **PDF文档 (.pdf)**
        - 支持文本型PDF（非扫描版）
        - 提取文本、元数据、结构信息
        - 支持表格和书签提取
        - 最大文件大小：100MB
        
        **Word文档 (.docx)**
        - 支持Microsoft Word 2007+格式
        - 提取文本、样式、表格
        - 支持标题层级和列表
        - 提取批注和修订信息
        
        **Markdown文档 (.md)**
        - 支持标准Markdown语法
        - 支持Front Matter元数据
        - 提取标题结构和目录
        - 支持代码块和表格
        """)
    
    # 性能指标
    with st.expander("⚡ 性能指标", expanded=False):
        st.markdown("""
        **处理速度:**
        - PDF: ~1MB/秒
        - Word: ~2MB/秒
        - Markdown: ~5MB/秒
        
        **内存使用:**
        - 基础内存: ~100MB
        - 每MB文档: ~10MB额外内存
        - 大文件建议分批处理
        
        **并发处理:**
        - 支持多文件并发处理
        - 自动负载均衡
        - 内存保护机制
        
        **优化建议:**
        - 单个文件建议不超过50MB
        - 批量处理建议不超过10个文件
        - 复杂文档建议简化切片策略
        """)
    
    # API接口
    with st.expander("🔌 API接口", expanded=False):
        st.markdown("""
        **核心API:**
        
        ```python
        # 文档处理器
        from src.core.document_processor import DocumentProcessor
        
        processor = DocumentProcessor()
        result = processor.process_file(
            file_path="document.pdf",
            clean_config=clean_config,
            chunk_config=chunk_config
        )
        
        # 文本清洗
        from src.core.text_cleaner import TextCleaner
        
        cleaner = TextCleaner(config)
        cleaned_text = cleaner.clean_text(raw_text)
        
        # 文档切片
        from src.core.chunking_engine import ChunkingEngine
        
        chunker = ChunkingEngine(strategy="fixed_length")
        chunks = chunker.chunk_text(text, config)
        ```
        
        **配置示例:**
        
        ```python
        # 清洗配置
        clean_config = {
            "normalize_unicode": True,
            "remove_special_chars": True,
            "fix_line_breaks": True,
            "remove_headers_footers": True,
            "remove_duplicates": True,
            "remove_empty_lines": True,
            "min_line_length": 10,
            "preserve_formatting": False
        }
        
        # 切片配置
        chunk_config = {
            "strategy": "fixed_length",
            "chunk_size": 500,
            "overlap_size": 50,
            "respect_sentence_boundary": True
        }
        ```
        """)
    
    # 扩展开发
    with st.expander("🔧 扩展开发", expanded=False):
        st.markdown("""
        **自定义处理器:**
        
        ```python
        from src.processors.base_processor import BaseProcessor
        
        class CustomProcessor(BaseProcessor):
            def extract_content(self, file_path: str) -> Dict[str, Any]:
                # 实现自定义文档解析逻辑
                pass
            
            def extract_metadata(self, file_path: str) -> Dict[str, Any]:
                # 实现自定义元数据提取
                pass
        ```
        
        **自定义切片策略:**
        
        ```python
        from src.core.chunking_strategies import BaseChunkingStrategy
        
        class CustomChunkingStrategy(BaseChunkingStrategy):
            def chunk(self, text: str, config: Dict[str, Any]) -> List[Dict[str, Any]]:
                # 实现自定义切片逻辑
                pass
        ```
        
        **自定义导出器:**
        
        ```python
        from src.exporters.base_exporter import BaseExporter
        
        class CustomExporter(BaseExporter):
            def export(self, data: List[Dict[str, Any]], config: Dict[str, Any]) -> str:
                # 实现自定义导出格式
                pass
        ```
        """)

def render_contact_support():
    """渲染联系支持"""
    
    st.subheader("📞 联系支持")
    st.markdown("遇到问题？我们来帮助您！")
    
    # 支持渠道
    col1, col2 = st.columns(2)
    
    with col1:
        st.markdown("### 📧 技术支持")
        st.markdown("""
        **邮箱支持:**
        - 技术问题：tech-support@example.com
        - 功能建议：feature-request@example.com
        - Bug报告：bug-report@example.com
        
        **响应时间:**
        - 工作日：24小时内回复
        - 周末：48小时内回复
        - 紧急问题：4小时内回复
        """)
    
    with col2:
        st.markdown("### 💬 在线支持")
        st.markdown("""
        **在线渠道:**
        - 官方QQ群：123456789
        - 微信群：扫描二维码加入
        - GitHub Issues：提交技术问题
        
        **支持时间:**
        - 工作日：9:00-18:00
        - 周末：10:00-16:00
        """)
    
    # 问题反馈表单
    st.markdown("### 📝 问题反馈")
    
    with st.form("feedback_form"):
        col1, col2 = st.columns(2)
        
        with col1:
            name = st.text_input("姓名")
            email = st.text_input("邮箱")
        
        with col2:
            issue_type = st.selectbox(
                "问题类型",
                ["技术问题", "功能建议", "Bug报告", "使用咨询", "其他"]
            )
            priority = st.selectbox(
                "优先级",
                ["低", "中", "高", "紧急"]
            )
        
        subject = st.text_input("问题标题")
        description = st.text_area("详细描述", height=150)
        
        # 附件上传
        uploaded_files = st.file_uploader(
            "上传相关文件（可选）",
            accept_multiple_files=True,
            help="可上传截图、日志文件等"
        )
        
        submitted = st.form_submit_button("提交反馈", type="primary")
        
        if submitted:
            if name and email and subject and description:
                # 这里应该实现实际的反馈提交逻辑
                st.success("✅ 反馈已提交！我们会尽快回复您。")
                st.info(f"📧 确认邮件将发送至：{email}")
            else:
                st.error("❌ 请填写所有必填字段")
    
    # 常用资源
    st.markdown("### 📚 常用资源")
    
    col1, col2, col3 = st.columns(3)
    
    with col1:
        if st.button("📖 用户手册", use_container_width=True):
            st.info("用户手册下载功能开发中...")
    
    with col2:
        if st.button("🎥 视频教程", use_container_width=True):
            st.info("视频教程页面开发中...")
    
    with col3:
        if st.button("💻 GitHub仓库", use_container_width=True):
            st.info("GitHub仓库链接开发中...")
    
    # 版本信息
    st.markdown("---")
    st.markdown("### ℹ️ 版本信息")
    
    col1, col2, col3, col4 = st.columns(4)
    
    with col1:
        st.metric("当前版本", "v1.0.0")
    
    with col2:
        st.metric("发布日期", "2024-01-01")
    
    with col3:
        st.metric("Python版本", "3.8+")
    
    with col4:
        st.metric("Streamlit版本", "1.28+")
    
    # 更新日志
    with st.expander("📋 更新日志", expanded=False):
        st.markdown("""
        **v1.0.0 (2024-01-01)**
        - 🎉 首次发布
        - ✅ 支持PDF、Word、Markdown文档处理
        - ✅ 多种切片策略
        - ✅ 数据清洗功能
        - ✅ 多格式导出
        - ✅ 质量分析和预览
        
        **计划中的功能:**
        - 🔄 OCR支持（扫描版PDF）
        - 🔄 更多文档格式支持
        - 🔄 API接口
        - 🔄 批量处理优化
        - 🔄 云端部署支持
        """)